package com.hlkj.warboot.configurer.security.authentication.provider;

import com.hlkj.warboot.configurer.security.SecurityUser;
import com.hlkj.warboot.configurer.util.LoggerUtil;
import com.hlkj.warboot.configurer.util.enums.DictionaryEnum;
import com.hlkj.warboot.module_sys.entity.AdminEntity;
import com.hlkj.warboot.module_sys.entity.PermissionEntity;
import com.hlkj.warboot.module_sys.mapper.AdminMapper;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @Description 获取用户信息（基本信息、角色、权限）
 * @Author 李星
 * @Date 2019/6/29 22:52
 */
@Component
public class MyUserDetailsService implements UserDetailsService {
    @Resource
    private AdminMapper adminMapper;

    /*
     * @Description 加载用户信息
     * @Author 李星
     * @Date 2019/5/30 22:10
     * @Param [username]
     * @return org.springframework.security.core.userdetails.UserDetails
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        try {
            /**
             * @Description TODO 查询管理员信息和其对应的权限信息
             *
             */
            AdminEntity userEntity = new AdminEntity();
            userEntity.setAccount( username );
            userEntity = adminMapper.queryAuthoritiesForLogin( userEntity );
            if (userEntity == null) {
                throw new UsernameNotFoundException( "账号不存在" );
            } else {
                Set<String> userAuthoritiesSet = new HashSet<>();
                // TODO 存储角色(格式：ROLE_角色名称)
                if (DictionaryEnum.ADMIN_GRADE_SUPER_ADMIN.getValue()== userEntity.getGrade() ) {
                    userAuthoritiesSet.add( "ROLE_SUPERADMIN" ); // 超级管理员
                } else if (DictionaryEnum.ADMIN_GRADE_PROVINCE.getValue() ==  userEntity.getGrade()) {
                    userAuthoritiesSet.add( "ROLE_ADMIN" ); // 省级管理员
                } else if (DictionaryEnum.ADMIN_GRADE_CITY.getValue() ==  userEntity.getGrade()) {
                    userAuthoritiesSet.add( "ROLE_ADMIN" ); // 市级管理员
                } else if (DictionaryEnum.ADMIN_GRADE_AREA.getValue() ==  userEntity.getGrade()) {
                    userAuthoritiesSet.add( "ROLE_ADMIN" ); // 区县级管理员
                }
                // TODO 存储权限(格式：/system/index)
                for (PermissionEntity permissionEntity : userEntity.getPermissionPojoList()) {
                    userAuthoritiesSet.add(permissionEntity.getAction());
                }

                // TODO 将authorityBuilder字符串转化成GrantedAuthority集合
                String userAuthoritiesStr = String.join(",", userAuthoritiesSet);
                List<GrantedAuthority> grantedAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList( userAuthoritiesStr );

                // TODO 默认当前系统用户状态有效
                boolean accountNonLocked = true;
                if (DictionaryEnum.USER_STATE_EFFECTIVE.getValue() != userEntity.getActive() ) {
                    accountNonLocked = false;
                }

                // TODO 5、返回一个自定以的MyAuthorityUser实例对象
                return new SecurityUser(
                        userEntity.getId(), // 编号
                        username, // 用户账号
                        userEntity.getPass(), // 用户密码
                        userEntity.getGrade(), // 用户等级（1:超级管理员,2:管理员,3:用户）
                        userEntity.getCover(), // 用户头像
                        userEntity.getPhone(), // 用户手机号码（同一个手机号码可以被多个账号绑定）
                        userEntity.getEmail(), // 用户邮箱（同一个手机号码可以被多个账号绑定）
                        true, // 默认账号可用
                        true, // 默认账户未过期
                        true, // 默认账号凭证未过期
                        accountNonLocked, // 账户是否被锁
                        grantedAuthorities // TODO 管理员的角色和权限信息
                        );
            }
        } catch (Exception e) {
            String errMsg = "账号不存在";
            if (errMsg.equals( e.getMessage() )) {
                throw new UsernameNotFoundException( errMsg );
            }
            LoggerUtil.error( MessageFormat.format( "登陆出错：{0}", e ) );
            throw new UsernameNotFoundException( "登陆出错" );
        }
    }
}
